package pe.com.bbva.pct.service.impl;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import pe.com.bbva.mtrgl.classLoader.AplicacionClassLoader;
import pe.com.bbva.pct.dao.AplicacionDAO;
import pe.com.bbva.pct.dao.ReglaDAO;
import pe.com.bbva.pct.domain.Aplicacion;
import pe.com.bbva.pct.domain.Regla;
import pe.com.bbva.pct.domain.Valor;
import pe.com.bbva.pct.dto.AplicacionDTO;
import pe.com.bbva.pct.service.AplicacionService;
import pe.com.bbva.pct.util.ConstantesGenerales;
import pe.com.bbva.pct.vo.AplicacionVO;

@Service("aplicacionService")
public class AplicacionServiceImpl implements AplicacionService {

	@Resource(name="aplicacionDao")
	private AplicacionDAO aplicacionDao;

	@Resource(name="aplicacionClassLoader")
	private AplicacionClassLoader aplicacionClassLoader;
	
	@Resource(name="reglaDao")
	private ReglaDAO reglaDao;
	
	@Transactional(readOnly = true)
	@Override
	public int cantidadTotalObjetos(Object aplicacionVO) throws Exception{				
		return aplicacionDao.cantidadTotalValores((AplicacionVO) aplicacionVO);
	}	
	
	
	@Transactional(readOnly = true)
	@Override
	public List<Object> buscarObjetosPaginados(int first, int pageSize,Object aplicacionVO) throws Exception{		
		List<Object> listaAplicacionesDTO =new ArrayList<Object>(); 
		List<Aplicacion> listaAplicacionesDomain =new ArrayList<Aplicacion>(); 
		try {
			listaAplicacionesDomain=aplicacionDao.obtenerValoresPaginado(first, pageSize,(AplicacionVO) aplicacionVO);
			Integer intNumeroItem=1;
			for(Aplicacion aplicacion:listaAplicacionesDomain){
				AplicacionDTO aplicacionDTO=new AplicacionDTO();
				aplicacionDTO.setItem(intNumeroItem);
				aplicacionDTO.setIdAplicacion(aplicacion.getIdAplicacion().toString());
				aplicacionDTO.setCodigo(aplicacion.getCodigo().toString());
				aplicacionDTO.setNombreCorto(aplicacion.getNombreCorto().toString());
				aplicacionDTO.setNombreLargo(aplicacion.getNombreLargo().toString());
				aplicacionDTO.setDescripcionEstado(aplicacion.getIdEstado().getNombre().toString());
				aplicacionDTO.setDescripcion(aplicacion.getDescripcion());
				listaAplicacionesDTO.add(aplicacionDTO);
				intNumeroItem++;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return listaAplicacionesDTO;		
	}
	
	@Transactional(readOnly = true)
	@Override
	public AplicacionDTO obtenerAplicacion(Long idAplicacion) throws Exception{
		AplicacionDTO aplicacionDTO = new AplicacionDTO();
		try {
			Aplicacion aplicacion = new Aplicacion();
			aplicacion= aplicacionDao.obtenerObjeto(idAplicacion, Aplicacion.class);
			
			aplicacionDTO.setIdAplicacion(aplicacion.getIdAplicacion().toString());
			aplicacionDTO.setCodigo(aplicacion.getCodigo().toString());
			aplicacionDTO.setNombreCorto(aplicacion.getNombreCorto().toString());
			aplicacionDTO.setNombreLargo(aplicacion.getNombreLargo().toString());
			aplicacionDTO.setIdEstado(aplicacion.getIdEstado().getIdValor().toString());
			aplicacionDTO.setDescripcion(aplicacion.getDescripcion());
			aplicacionDTO.setNombreJar(aplicacion.getNombreJar().toString());
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return aplicacionDTO;
	}
	
	@Transactional(rollbackFor = Exception.class)
	@Override
	public void insertarAplicacion(Aplicacion aplicacion, InputStream archivo) throws Exception{
		try {				
			Long codigoAutogenerado = aplicacionDao.obtenerUltimoCodigo();
			codigoAutogenerado=codigoAutogenerado+1L;			
			aplicacion.setCodigo(String.format("%04d",Integer.parseInt(codigoAutogenerado.toString())));
			aplicacion.setNombreJar(aplicacion.getNombreCorto()+aplicacion.getCodigo());
			aplicacionDao.insertarObjeto(aplicacion);
			aplicacionClassLoader.addClassLoader(aplicacion.getNombreJar(), archivo);			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	@Transactional(rollbackFor = Exception.class)
	@Override
	public void eliminarAplicacion(Long idAplicacion) throws Exception{
		try {
			Aplicacion aplicacion = new Aplicacion();
			aplicacion=aplicacionDao.obtenerObjeto(idAplicacion, Aplicacion.class);
			aplicacion.setIdEstado(new Valor());
			aplicacion.getIdEstado().setIdValor(ConstantesGenerales.VALOR_ELIMINADO);
			aplicacionDao.actualizarObjeto(aplicacion);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	@Transactional(rollbackFor = Exception.class)
	@Override
	public void actualizarAplicacion(Aplicacion aplicacion,InputStream archivo) throws Exception{						
		aplicacion.setNombreJar(aplicacion.getNombreCorto()+aplicacion.getCodigo());									
		aplicacionDao.actualizarObjeto(aplicacion);			
		aplicacionClassLoader.addClassLoader(aplicacion.getNombreJar(), archivo);							
	}
	
	
	public Integer validarIntegridadAplicacion(Long idAplicacion) throws Exception{
		Integer cantidad=0;
		try {
			List<Regla> listaReglas = reglaDao.listarReglasPorAplicacion(idAplicacion);
			cantidad= listaReglas.size();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return cantidad;
	}
}
